#ifndef ENVIRONMENTFACTORY_H_
#define ENVIRONMENTFACTORY_H_

#include "../Exception/GA_Exception.h"

#include "Environment.h"
#include "Knapsack/KnapsackEnvironment.h"
#include "TravelingSalesman/TravelingSalesmanEnvironment.h"
#include "RootFinder/RootFinderEnvironment.h"
#include "MineSweeper/MineSweeperEnvironment.h"
#include "JobShopScheduling/JobShopSchedulingEnvironment.h"

#include "../Solution/BitEncoded/BitEncodedSolution.h"
#include "../Solution/PermutationEncoded/PermutationEncodedSolution.h"
#include "../Solution/ValueEncoded/ValueEncodedSolution.h"

#define SALESMAN_ENVIRONMENT 0
#define KNAPSACK_ENVIRONMENT 1
#define MINESWEEPER_ENVIRONMENT 2
#define JOB_SHOP_SCHEDULING_ENVIRONMENT 3

/** Class for providing an interface to generate different kinds of environments.
 */
class EnvironmentFactory 
{
    public:
        static Environment* generateEnvironment();     /**< Prompts for an environment and returns a pointer to a new object of that type */
        static Environment* generateEnvironment(int);  /**< Returns an environment of the specified type                                  */
        static vector<string> getEnvironmentNames();
    
    private:
        EnvironmentFactory();
};

#endif /*ENVIRONMENTFACTORY_H_*/
